home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d949.lha / BBBBS / BBBBS65.lha / rexx / bbsExtDL.baud < prev    next >
Text File  |  1993-10-29  |  16KB  |  600 lines

  1. /* $VERS: bbsExtDL.baud 6.5 (29.10.93)
  2.  copyright 1992 Richard Lee Stockton
  3.          FREELY DISTRIBUTABLE
  4.  
  5. Allows BBBBS user to download from extra devices like CD drives.
  6. Keeps track of time left to this user, and watches for hangup.
  7.  
  8. Just ignores file or directory names that contain spaces
  9.  because BBBBS would be unable to download them anyway.
  10.  
  11. Ignores icons (files that end in .info).
  12.  
  13. A textfile in BBS:Lists, CD_Exclude, controls exclusion of
  14.  drawers on certain CDs that contain copyright files. Other
  15.  specific files or directories can be excluded by adding
  16.  their paths to the CD_Exclude textfile, one path per line.
  17.  
  18. Super-sysop may select very large directories and have their
  19.  formatted display lists cached as textfiles in bbspath'Cache'.
  20.  This can greatly improve access time for very large drawers,
  21.  especially if they contain sub-directories.
  22. */
  23.  
  24. SIGNAL ON BREAK_C
  25. SIGNAL ON BREAK_E
  26.  
  27. PARSE ARG name level maxtime linesperpage colorflag devlist 
  28.  
  29. exclude=''
  30. bbspath=GETCLIP('BBS_path')
  31. x=OPEN(f,bbspath'Lists/CD_Exclude','R')
  32. IF x~=0 THEN exclude=READCH(f,65000)
  33. CALL CLOSE(f)
  34. exclude=UPPER(TRANSLATE(exclude,' ','0A'x))
  35.  
  36. lists.=''
  37. lists.0=0
  38. maxtime=maxtime-30
  39. CALL TIME('R')
  40. CR='0D'x
  41. def=''
  42. pen3=''
  43. IF colorflag~=1 THEN
  44.   DO
  45.     def=''
  46.     pen3=''
  47.   END
  48. SAY CR
  49. x=OPEN(f,bbspath'BBS_TEXT/EXT_INFO','R')
  50. IF x=0 THEN SAY bbspath'BBS_TEXT/EXT_INFO failed to open!'CR
  51. ELSE
  52.   DO
  53.     DO i=1 WHILE ~EOF(f)
  54.       SAY READLN(f)||CR
  55.     END
  56.     CALL CLOSE(f)
  57.   END
  58. selected=''
  59. path=''
  60. templist=devlist
  61. devlist=''
  62. longest=0
  63. CALL PRAGMA('W','N')  /* disk requesters OFF */
  64. CALL PRAGMA('D',bbspath'Information')
  65. test3=PRAGMA('D')
  66. DO i=1 TO WORDS(templist)
  67.   test=WORD(templist,i)
  68.   IF ~EXISTS(test) THEN ITERATE i
  69.   CALL PRAGMA('D',test)
  70.   test2=PRAGMA('D')
  71.   IF test2=test3 THEN ITERATE i
  72.   IF WORDS(test2)>1 THEN test2=test
  73.   devlist=STRIP(devlist test2)
  74.   IF LENGTH(test2)>longest THEN longest=LENGTH(test2)
  75. END
  76. cols=76%(longest+8)
  77. IF devlist='' THEN
  78.   DO
  79.     SAY CR
  80.     SAY '*** Sorry, no External Devices are available! ***'CR
  81.     SAY CR
  82.     OPTIONS PROMPT 'Press RETURN'
  83.     PULL junk
  84.     EXIT('')
  85.   END
  86.  
  87. picklist=devlist
  88. IF WORDS(picklist)=1 THEN
  89.   DO
  90.     path=picklist
  91.     IF RIGHT(path,1)~=':' THEN path=path'/'
  92.     picklist=makepicklist()
  93.   END
  94. ELSE
  95.   DO
  96.     lists.0=1
  97.     dirs=WORDS(devlist)
  98.   END
  99. CALL checkdcd()
  100.  
  101. OPTIONS PROMPT 'Press RETURN'
  102. PULL junk
  103.  
  104. DO loop=1
  105.   CALL checkdcd()
  106.   test=TIME('E')
  107.   IF test>(maxtime-100) THEN
  108.     DO
  109.       SAY CR
  110.       IF test>maxtime THEN
  111.         DO
  112.           SAY '*** This session''s time is expiring! ***'CR
  113.           SAY CR
  114.           LEAVE loop
  115.         END
  116.       ELSE SAY '*** Less than 2 minutes remaining! ***'CR
  117.       SAY CR
  118.     END
  119.   filename=pick(picklist)
  120.   IF filename='' THEN
  121.     DO
  122.       temp=path
  123.       IF RIGHT(temp,1)='/' THEN temp=LEFT(temp,LENGTH(temp)-1)
  124.       IF FIND(UPPER(devlist),UPPER(temp))>0 THEN
  125.         DO
  126.           IF WORDS(devlist)=1 THEN ITERATE loop
  127.           picklist=devlist
  128.           path=''
  129.           ITERATE loop
  130.         END
  131.       ELSE
  132.         DO
  133.           test=RIGHT(path,1)
  134.           IF test='/' THEN path=LEFT(path,LENGTH(path)-1)
  135.           slash=LASTPOS('/',path)
  136.           IF slash=0 THEN slash=LASTPOS(':',path)
  137.           path=LEFT(path,slash)
  138.         END
  139.     END
  140.   IF filename=':-)' THEN ITERATE loop
  141.   tempath=path||filename
  142.   temp=WORD(STATEF(tempath),1)
  143.   IF temp='FILE' THEN
  144.     DO
  145.       IF FIND(UPPER(selected),UPPER(tempath))=0 THEN
  146.         selected=selected tempath
  147.       ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(tempath)),1)
  148.       shosel=''
  149.       ITERATE loop
  150.     END
  151.   ELSE IF temp='DIR' THEN
  152.     DO
  153.       path=tempath
  154.       test=RIGHT(path,1)
  155.       IF test~='' & test~='/' & test~=':' THEN path=path'/'
  156.     END
  157.   ELSE IF UPPER(filename)='DONE' THEN LEAVE loop
  158.   IF path~='' THEN picklist=makepicklist()
  159. END
  160. selected=STRIP(selected)
  161. test=''
  162. IF WORDS(selected)=1 THEN test=UPPER(RIGHT(selected,4))
  163. IF selected~='' & test~='.LHA' & test~='.LZH' & test~='.DMS' & test~='.ZOO' THEN
  164.   DO
  165.     SAY CR
  166.     SAY 'You may choose to have your selection(s) archived using LhA.'CR
  167.     SAY 'This makes downloading faster, if the files are not already compressed.'CR
  168.     SAY 'The completed archive will be attached to email addressed to you.'CR
  169.     SAY CR
  170.     OPTIONS PROMPT 'Archive selected files? (nY) > '
  171.     PULL temp
  172.     IF LEFT(temp,1)~='N' THEN
  173.       DO
  174.         ADDRESS AREXX bbsArcExt.rexx name selected
  175.         selected=''
  176.         SAY CR
  177.         SAY 'BBBBS will notify you online when your archive is ready.'CR
  178.         SAY CR
  179.       END
  180.   END
  181. IF ADDRESS()='BAUD' THEN SAY 'Returning to the BBS...'CR
  182. SAY CR
  183. EXIT selected
  184.  
  185.  
  186. checkdcd:
  187. IF ADDRESS()~='BAUD' THEN RETURN
  188. dcd
  189. IF RC~=0 THEN RETURN
  190. CALL DELAY(128)
  191. dcd
  192. IF RC=0 THEN
  193.   DO
  194.     SAY CR
  195.     SAY '*** Lost Carrier while using bbsExtDL.baud ***'CR
  196.     EXIT('')
  197.   END
  198. RETURN
  199.  
  200.  
  201. makepicklist:
  202. IF path='' THEN RETURN ''
  203. IF STORAGE()<100000 THEN
  204.   DO
  205.     lists.=''
  206.     lists.0=0
  207.     IF WORDS(devlist)>1 THEN
  208.       DO
  209.         lists.0=1
  210.         lists.1.0=devlist
  211.       END
  212.   END
  213. DO i=1 TO lists.0
  214.   IF path=lists.i THEN RETURN lists.i.0
  215. END
  216. cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  217. IF cname~='' & EXISTS(bbspath'Cache/'cname) THEN
  218.   DO cloop=1 TO 1
  219.     k=lists.0+1
  220.     lists.0=k
  221.     x=OPEN(f,bbspath'Cache/'cname'.','R')
  222.     IF x=0 THEN SAY bbspath'Cache/'cname'. failed to open!'CR
  223.     ELSE
  224.       DO
  225.         cpath=READLN(f)
  226.         IF cpath=path THEN lists.k=path
  227.         ELSE
  228.           DO
  229.             IF level=99 THEN
  230.               SAY path 'does not match cache path in' cname'. !'CR
  231.             CALL CLOSE(f)
  232.             lists.0=lists.0-1
  233.             LEAVE cloop
  234.           END
  235.         DO i=1
  236.           line=READLN(f)
  237.           IF EOF(f) THEN LEAVE i
  238.           IF colorflag~=1 THEN
  239.             DO
  240.               n=POS('1B'x,line)
  241.               DO WHILE n>0
  242.                 DO m=2
  243.                   IF DATATYPE(SUBSTR(line,n+m,1),'M') | (n+m+1)>LENGTH(line) THEN
  244.                     leave m
  245.                 END
  246.                 line=DELSTR(line,n,m+1)
  247.                 n=POS('1B'x,line)
  248.               END
  249.             END
  250.           lists.k.i=line
  251.         END
  252.         CALL CLOSE(f)
  253.         lists.k.ROWS=i-1
  254.       END
  255.     x=OPEN(f,bbspath'Cache/'cname,'R')
  256.     IF x=0 THEN
  257.       DO
  258.         SAY bbspath'Cache/cname failed to open!'CR
  259.         CALL CLOSE(f)
  260.         lists.0=lists.0-1
  261.         LEAVE cloop
  262.       END
  263.     ELSE
  264.       DO
  265.         plist=READCH(f,65000)
  266.         CALL CLOSE(f)
  267.         lists.k.0=plist
  268.         RETURN plist
  269.       END
  270.   END
  271. SAY 'Loading...'CR
  272. CALL FileList(path'*',filelist,'F','N')
  273. IF filelist.0>1 THEN CALL QSORT(1,filelist.0,filelist)
  274. CALL FileList(path'*',dirlist,'D','N')
  275. IF dirlist.0>1 THEN CALL QSORT(1,dirlist.0,dirlist)
  276. plist=''
  277. dirs=0
  278. longest=0
  279. DO i=1 TO filelist.0
  280.   IF WORDS(filelist.i)~=1 THEN ITERATE i
  281.   IF filelist.i='' THEN ITERATE i
  282.   IF UPPER(RIGHT(filelist.i,5))='.INFO' THEN ITERATE i
  283.   IF FIND(exclude,UPPER(path||filelist.i))>0 THEN ITERATE i
  284.   plist=STRIP(plist filelist.i)
  285.   IF LENGTH(filelist.i)>longest THEN longest=LENGTH(filelist.i)
  286. END
  287. DO i=1 TO dirlist.0
  288.   IF WORDS(dirlist.i)~=1 THEN ITERATE i
  289.   IF FIND(exclude,UPPER(path||dirlist.i))>0 THEN ITERATE i
  290.   plist=STRIP(plist dirlist.i)
  291.   IF LENGTH(dirlist.i)>longest THEN longest=LENGTH(dirlist.i)
  292.   dirs=dirs+1
  293. END
  294. cols=76%(longest+9)
  295. lists.0=lists.0+1
  296. i=lists.0
  297. lists.i=path
  298. lists.i.0=plist
  299. DROP filelist. dirlist. 
  300. RETURN plist
  301.  
  302.  
  303. pick:
  304. PARSE ARG list 
  305. selection=''
  306. DO k=1 TO lists.0
  307.   IF path=lists.k THEN LEAVE k
  308. END
  309. IF ~DATATYPE(lists.k.ROWS,'N') THEN
  310.   DO
  311.     items=WORDS(list)
  312.     IF items<75 & dirs<25 THEN SAY 'Formatting' items 'items...'CR
  313.     ELSE SAY 'Please be patient, formatting' items 'items may take a while...'CR
  314.     lists.k.ROWS=(items%cols)+((items//cols)>0)
  315.     IF cols>items THEN cols=items
  316.     IF cols<1 THEN cols=1
  317.     longest=(76%cols)-8
  318.     lists.k=path
  319.     DO j=0 TO cols-1
  320.       DO i=1 TO lists.k.ROWS
  321.         thisnum=j*lists.k.ROWS+i
  322.         IF thisnum<=items THEN
  323.           DO
  324.             thisitem=WORD(list,thisnum)
  325.             filestat=STATEF(path||thisitem)
  326.             thisitem=LEFT(thisitem,longest)' '
  327.             IF WORD(filestat,1)='DIR' THEN
  328.               lists.k.i=lists.k.i||pen3'(dir) 'thisitem||def
  329.             ELSE
  330.               DO
  331.                 bytes=WORD(filestat,2)
  332.                 IF bytes<10000 THEN 
  333.                   lists.k.i=lists.k.i||RIGHT(bytes,5) thisitem
  334.                 ELSE IF bytes>1023999 THEN 
  335.                   lists.k.i=lists.k.i||RIGHT(bytes%1024000,4)'m' thisitem
  336.                 ELSE lists.k.i=lists.k.i||RIGHT(bytes%1024,4)'k' thisitem
  337.               END
  338.           END
  339.       END
  340.     END
  341.     IF level=99 & items>24 THEN
  342.       DO
  343.         SAY items 'items,' dirs 'dirs,' lists.k.ROWS 'rows'
  344.         OPTIONS PROMPT 'FileCache' path'? (Ny) > '
  345.         PULL junk
  346.         junk=LEFT(junk,1)
  347.         IF junk='Y' THEN
  348.           DO
  349.             CALL MAKEDIR(bbspath'Cache')
  350.             cname=STRIP(RIGHT(COMPRESS(path,' ._-:/'),29))
  351.             x=OPEN(f,bbspath'Cache/'cname,'W')
  352.             IF x=0 THEN SAY 'Unable to open cache file' cname'!'CR
  353.             ELSE
  354.               DO
  355.                 CALL WRITECH(f,list)
  356.                 CALL CLOSE(f)
  357.               END
  358.             x=OPEN(f,bbspath'Cache/'cname'.','W')
  359.             IF x=0 THEN
  360.               DO
  361.                 SAY 'Unable to open cache file' cname'. !'CR
  362.                 CALL DELETE(bbspath'Cache/'cname)
  363.               END
  364.             ELSE
  365.               DO
  366.                 CALL WRITELN(f,path)
  367.                 DO i=1 TO lists.k.ROWS
  368.                   CALL WRITELN(f,TRIM(lists.k.i))
  369.                 END
  370.                 CALL CLOSE(f)
  371.                 SAY path 'has been cached.'CR
  372.               END
  373.           END
  374.       END
  375.   END
  376. IF selected~='' THEN
  377.   DO
  378.     SAY CR
  379.     w=WORDS(selected)
  380.     temp=pen3' 'w def'selected files.'
  381.     IF shosel~=1 THEN
  382.       DO
  383.         SAY pen3'selected:'def||CR
  384.         DO i=1 TO w
  385.           SAY WORD(selected,i)||CR
  386.         END
  387.       END
  388.     ELSE temp='Enter' pen3'SHOW S'def'elected to display'temp
  389.     SAY temp||CR
  390.     IF w>5 THEN shosel=1
  391.   END
  392. SAY CR
  393. SAY 'current path ='pen3 path||def||CR
  394. SAY LEFT('-',75,'-')||CR
  395. OPTIONS PROMPT ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - '
  396. DO i=1 TO lists.k.ROWS
  397.   SAY TRIM(lists.k.i)||CR
  398.   IF (i+2)//(linesperpage-1)=0 & nonstop~=1 THEN
  399.     DO
  400.       CALL whodat()
  401.       PULL junk
  402.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  403.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  404.       IF colorflag=1 THEN SAY '1B'x'M'||LEFT('',75)||'1B'x'M'||CR
  405.     END
  406. END
  407. nonstop=0
  408. SAY LEFT('-',75,'-')||CR
  409. CALL whodat()
  410. readflag=0
  411. DO getloop=1
  412.   pstring=showtime()'   Enter ''?'' for HELP > '
  413.   OPTIONS PROMPT pstring
  414.   PARSE PULL selection 
  415.   IF selection='?' THEN
  416.     DO
  417.       CALL help()
  418.       OPTIONS PROMPT 'Press RETURN'
  419.       PULL junk
  420.       selection=';-)'
  421.       LEAVE getloop
  422.     END
  423.   IF WORDS(selection)>1 THEN
  424.     DO
  425.       IF LEFT(UPPER(selection),6)='SHOW S' THEN
  426.         DO
  427.           shosel=''
  428.           selection=';-)'
  429.           LEAVE getloop
  430.         END
  431.       IF UPPER(selection)='SELECT ALL' THEN
  432.         DO
  433.           IF path='' | RIGHT(path,1)=':' | POS(UPPER(path),UPPER(devlist))>0 THEN
  434.             DO
  435.               SAY CR
  436.               SAY pen3'*** Archiving entire devices at one time is NOT allowed! ***'def||CR
  437.               SAY CR
  438.               ITERATE getloop
  439.             END
  440.           CALL selall(path)
  441.           shosel=''
  442.           selection=':-)'
  443.           LEAVE getloop
  444.         END
  445.       ELSE IF UPPER(WORD(selection,1))='READ' THEN
  446.         DO
  447.           readflag=1
  448.           selection=STRIP(DELWORD(selection,1,1))
  449.         END
  450.     END
  451.   i=FIND('DONE' UPPER(list),UPPER(selection))
  452.   IF i=0 THEN
  453.     DO
  454.       i=FIND('DONE' UPPER(list),UPPER(selection':'))
  455.       IF i=0 THEN ITERATE getloop
  456.       selection=selection':'
  457.     END
  458.   IF selection='' & path='' THEN ITERATE getloop
  459.   ELSE IF i>1 THEN selection=WORD(list,i-1)
  460.   IF readflag=1 THEN
  461.     DO
  462.       endtest=UPPER(RIGHT(selection,4))
  463.       IF FIND('.ARC .DMS .LZH .LHA .ZIP .ZOO',endtest)>0 THEN
  464.         DO
  465.           CALL Contents.rexx(path||selection)
  466.           IF EXISTS('RAM:CONTENTS') THEN CALL showtext('RAM: CONTENTS')
  467.         END
  468.       ELSE CALL showtext(path selection)
  469.       readflag=0
  470.       selection=';-)'
  471.     END
  472.   LEAVE getloop
  473. END
  474. RETURN selection
  475.  
  476.  
  477. selall: PROCEDURE EXPOSE selected pen3 def CR
  478. PARSE ARG dir .
  479. IF FIND(exclude,UPPER(dir))>0 THEN RETURN
  480. SAY 'Processing'pen3 dir||def||CR
  481. IF RIGHT(dir,1)~='/' THEN dir=dir'/'
  482. filelist.=''
  483. CALL FileList(dir'*',filelist,'F','F')
  484. DO i=1 TO filelist.0
  485.   IF filelist.i='' THEN ITERATE i
  486.   IF FIND(UPPER(selected),UPPER(filelist.i))=0 & FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x)=0 THEN
  487.     DO
  488.       IF WORDS(filelist.i)>1 THEN
  489.         DO
  490.           SAY 'Space(s) in filename!  Unable to archive' filelist.i'.'CR
  491.           ITERATE i
  492.         END
  493.       selected=STRIP(selected filelist.i)
  494.     END
  495.   ELSE IF FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x)>0 THEN
  496.     selected=DELWORD(selected,FIND(UPPER(selected),'22'x||UPPER(filelist.i)'22'x),1)
  497.   ELSE selected=DELWORD(selected,FIND(UPPER(selected),UPPER(filelist.i)),1)
  498. END
  499. dirlist.=''
  500. IF FileList(dir'*',dirlist,'D','F')=0 THEN RETURN
  501. DO j=1 TO dirlist.0
  502.   CALL selall(dirlist.j)
  503. END
  504. RETURN
  505.  
  506.  
  507. showtext:
  508. PARSE ARG tpath' 'textfile 
  509. test=RIGHT(tpath,1)
  510. IF test~='' & test~=':' & test~='/' THEN tpath=tpath'/'
  511. x=OPEN(f,STRIP(tpath||textfile),'R')
  512. IF x=0 THEN RETURN
  513. test=READCH(f,64)
  514. mask=XRANGE(,'06'x)||XRANGE('0E'x,'1A'x)||XRANGE('1C'x,'1F'x)
  515. IF VERIFY(test,mask,'M')>0 THEN
  516.   DO
  517.     CALL CLOSE(f)
  518.     testloc=VERIFY(test,mask,'M')
  519.     SAY '*** not an archive or a text file! ***'CR
  520.     SAY 'Character number' testloc 'is ASCII' C2D(SUBSTR(test,testloc,1))||CR
  521.     RETURN
  522.   END
  523. CALL SEEK(f,0,'B')
  524. OPTIONS PROMPT ' - ['pen3'N'def']on-stop  ['pen3'Q'def']uit  ['pen3'RETURN'def']=Continue - '
  525. SAY CR
  526. SAY '-' tpath||textfile '-'CR
  527. DO i=1 WHILE ~EOF(f)
  528.   SAY COMPRESS(READLN(f),CR||'0C'x)||CR
  529.   IF i//(linesperpage-1)=0 & nonstop~=1 THEN
  530.     DO
  531.       CALL whodat()
  532.       PULL junk
  533.       IF LEFT(UPPER(junk),1)='Q' THEN LEAVE i
  534.       IF LEFT(UPPER(junk),1)='N' THEN nonstop=1
  535.       IF colorflag=1 | ADDRESS()~='BAUD'THEN
  536.         SAY '1B'x'M'||LEFT('',60)||'1B'x'M'||CR
  537.     END
  538. END
  539. CALL CLOSE(f)
  540. IF i//(linesperpage-1)>1 THEN
  541.   DO
  542.     OPTIONS PROMPT ' - ['pen3'RETURN'def']=Continue - '
  543.     PULL junk
  544.   END
  545. nonstop=0
  546. RETURN
  547.  
  548.  
  549. whodat:
  550. IF ADDRESS()~='BAUD' THEN RETURN
  551. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  552. CALL checkdcd()
  553. RETURN
  554.  
  555.  
  556. help:
  557. SAY CR
  558. SAY CR
  559. SAY pen3'- HELP -'def
  560. SAY CR
  561. SAY 'You can navigate through directory levels using the following commands.'CR
  562. SAY 'Remember that the name must appear in the display before you can select it.'CR
  563. SAY 'Filenames are displayed with their filesizes on the left, and directories'CR
  564. SAY 'will have a' pen3'(dir)'def' on their left.'CR
  565. SAY CR
  566. SAY 'To select an item from the displayed list, enter its name as displayed.'CR
  567. SAY 'If the selected item is a' pen3'directory'def', its contents will be displayed.'CR
  568. SAY 'If the selected item is a file, it is added to the ''selected'' list.'CR
  569. SAY 'To remove a selected file from the list, enter its name again.'CR
  570. SAY CR
  571. SAY 'To display the parent directory, enter an ''empty'' RETURN'CR
  572. SAY 'To read a textfile or see the contents of an archive, enter READ filename.'CR
  573. SAY 'To select ALL items from the current display, including the contents of all'CR
  574. SAY 'displayed directories and their sub-directories, enter SELECT ALL.'CR
  575. SAY CR
  576. SAY 'Enter'pen3 'DONE' def'to return to the BBS (and download any selected files)'CR
  577. SAY CR
  578. RETURN
  579.  
  580.  
  581. showtime:
  582. mins=(maxtime-TIME('E'))%60
  583. secs=TRUNC((maxtime-TIME('E'))//60)
  584. IF secs<10 THEN secs='0'secs
  585. RETURN 'Time Remaining: 'mins':'secs
  586.  
  587.  
  588. BREAK_E:
  589. SAY CR
  590. SAY pen3'*** CONTROL-E BREAK ***'def||CR
  591. i=999999
  592. RETURN ''
  593.  
  594.  
  595. BREAK_C:
  596. SAY CR
  597. EXIT ''
  598.  
  599. /* bbsExtDL.baud */
  600.